//package cn.tm.ms.nerver.qos;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//import org.more.util.MatchUtils;
//import org.more.util.StringUtils;
//import net.hasor.core.Settings;
//import net.hasor.rsf.address.InterAddress;
//import net.hasor.rsf.address.route.rule.AbstractRule;
///**
// * 单元流量控制规则，用来控制跨单元调用。<p>
// * <pre>例：
// * 配置实例：
// * &lt;flowControl enable="true|false" type="unit"&gt;
// *   &lt;threshold&gt;0.3&lt;/threshold&gt;
// *   &lt;exclusions&gt;172.23.*,172.19.*&lt;/exclusions&gt;
// * &lt;/flowControl&gt;
// * </pre>
// * 解释： 对某一服务，开启本单元优先调用策略
// * 但当本单元内的可用机器的数量占服务地址全部数量的比例小于0.3时，本单元优先调用策略失效，启用跨单元调用。
// * 该规则对以下网段的服务消费者不生效：172.23.*,172.19.*
// */
//public class UnitFlowControl extends AbstractRule {
//    private float        threshold;
//    private List<String> exclusions;
//    //
//    public void paserControl(Settings settings) {
//        this.enable(settings.getBoolean("flowControl.enable"));
//        this.threshold = settings.getFloat("flowControl.threshold");
//        String exclusions = settings.getString("flowControl.exclusions");
//        this.exclusions = Arrays.asList(exclusions.split(","));
//    }
//    public float getThreshold() {
//        return this.threshold;
//    }
//    public List<String> getExclusions() {
//        return this.exclusions;
//    }
//    //
//    /**
//     * 是否启用本地机房优先规则
//     * @param allAmount 所有可用地址数量
//     * @param localAmount 本地机房地址数量
//     */
//    public boolean isLocalUnit(int allAmount, int localAmount) {
//        if (localAmount == 0 || !this.enable()) {
//            return false;
//        }
//        float value = (localAmount + 0.0F) / allAmount;
//        if (value >= this.getThreshold()) {
//            return true;
//        }
//        return false;
//    }
//    //
//    /**筛选本机房地址*/
//    public List<InterAddress> siftUnitAddress(String unitName, List<InterAddress> address) {
//        if (address == null || address.isEmpty())
//            return null;
//        //
//        List<InterAddress> local = new ArrayList<InterAddress>();
//        List<String> exclusions = getExclusions();
//        for (InterAddress inter : address) {
//            boolean appendMark = false;
//            //A.如果位于规则排除名单中,则直接标记appendMark为 true
//            if (exclusions != null && exclusions.isEmpty() == false) {
//                String hostIP = inter.getHost();
//                for (String ipPattern : exclusions) {
//                    if (MatchUtils.matchWild(ipPattern, hostIP)) {
//                        appendMark = true;
//                        break;
//                    }
//                }
//            }
//            //B.如果匹配规则,则直接标记appendMark为 true
//            if (appendMark == false) {
//                appendMark = StringUtils.equalsBlankIgnoreCase(inter.getFormUnit(), unitName);
//            }
//            //
//            if (appendMark) {
//                local.add(inter);
//            }
//        }
//        return local;
//    }
//}